home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / CTOOLS10.ARJ / STK.H < prev    next >
C/C++ Source or Header  |  1991-10-28  |  2KB  |  68 lines

  1. /****************************************************************************
  2. *
  3. *                    Copyright (C) 1991 Kendall Bennett.
  4. *                            All rights reserved.
  5. *
  6. * Filename:        $RCSfile: stk.h $
  7. * Version:        $Revision: 1.1 $
  8. *
  9. * Language:        ANSI C
  10. * Environment:    any
  11. *
  12. * Description:    Stack maintenance macros. Create downward-growing stacks.
  13. *
  14. * $Id: stk.h 1.1 91/08/16 13:32:27 ROOT_DOS Exp $
  15. *
  16. * Revision History:
  17. * -----------------
  18. *
  19. * $Log:    stk.h $
  20. * Revision 1.1  91/08/16  13:32:27  ROOT_DOS
  21. * Initial revision
  22. ****************************************************************************/
  23.  
  24. #ifndef __STK_H
  25. #define __STK_H
  26.  
  27. #define    stack_cls            /* No stack class defined! */
  28.  
  29. #define    stack_dcl(stack,type,size)    typedef type t_##stack;                \
  30.                                     stack_cls t_##stack stack[size];    \
  31.                                     stack_cls t_##stack (*p_##stack)    \
  32.                                                 = stack + (size)
  33.  
  34. #define    stack_clear(stack)    ( (p_##stack) = (stack +                     \
  35.                                             sizeof(stack)/sizeof(*stack)) )
  36.  
  37. #define    stack_full(stack)    ( (p_##stack) <= stack )
  38. #define    stack_empty(stack)    ( (p_##stack) >= (stack + \
  39.                                             sizeof(stack)/sizeof(*stack)) )
  40.  
  41. #define    stack_ele(stack)    ((sizeof(stack)/sizeof(*stack)) -            \
  42.                                             (p_##stack-stack))
  43.  
  44. #define    stack_item(stack,offset) ( *(p_##stack + (offset)) )
  45. #define    stack_p(stack)        p_##stack
  46.  
  47. #define    push_(stack,x)        ( *--p_##stack = (x) )
  48. #define    pop_(stack)            ( *p_##stack++ )
  49.  
  50. #define    push(stack,x)        ( stack_full(stack)                            \
  51.                                 ? ((t_##stack) (long) (stack_err(1)))    \
  52.                                 : push_(stack,x))
  53.  
  54. #define    pop(stack)            ( stack_empty(stack)                        \
  55.                                 ? ((t_##stack) (long) (stack_err(0)))    \
  56.                                 : pop_(stack))
  57.  
  58. #define    popn_(stack,amt)    ( (p_##stack += amt)[-amt] )
  59. #define    popn(stack,amt)        ( (stack_ele(stack) < amt)                    \
  60.                                 ? ((t_##stack) (long) (stack_err(0)))    \
  61.                                 : popn_(stack,amt))
  62.  
  63. #define    stack_err(o)        ((o) ? ferr("Stack overflow\n")                \
  64.                                  : ferr("Stack underflow\n"))
  65.  
  66. #endif
  67.